#include<iostream>
#include<memory>
struct Date
{
    int _year,_month,_day;
    Date(int year = 1,int month = 1, int day = 1)
    :_year(year),_month(month),_day(day)
    {}

    ~Date()
    {
        std::cout << "~Date()" << std::endl;
    }

};

//模板函数
template <class T>
void DeleteArrayFunc(T* ptr)
{
    delete[] ptr;
}

//仿函数
template <class T>
class DateArray
{
    public:
        void operator()(T* ptr)
        {
            delete[] ptr;
        }
};
int main()
{
    //这里会报错,因为库中的智能指针默认是使用delete来释放的,而我们这里申请的是一段连续的空间
    //std::unique_ptr<Date> up(new Date[10]);
    //std::shared_ptr<Date> sp1(new Date[10]);


    //解决方法一:使用仿函数/函数指针/lambda表达式做删除器以自己的方式释放资源

    //使用仿函数做删除器
    // std::unique_ptr<Date,DateArray<Date>> up1(new Date[5]);
    // std::shared_ptr<Date> sp1(new Date[5],DateArray<Date>());

    //使用函数做删除器
    // std::unique_ptr<Date,void(*)(Date*)> up2(new Date[5],DeleteArrayFunc<Date>);
    // std::shared_ptr<Date> sp2(new Date[5],DeleteArrayFunc<Date>);//模板是即用即生成,所以要指定类型

    //lambda表达式做删除器
    // auto DelArrObj = [](Date* ptr)->void{delete[] ptr;};
    // std::unique_ptr<Date,decltype(DelArrObj)> up3(new Date[5],DelArrObj);//decltype可以根据对象推到出类型
    // std::shared_ptr<Date> sp3(new Date[5],DelArrObj);

    //解决方法二:底层自带的方法(底层采用了特化的方式进行处理)
    std::unique_ptr<Date[]> up4(new Date[5]);
    std::shared_ptr<Date[]> sp4(new Date[5]);


    return 0;
}